/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package wczytajCSV;

import java.awt.Component;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

/**
 *
 * @author lukasz
 */
public class CSV extends AbstractTableModel{
    private int iloscWierszy;
    private int iloscKolumn;
    Object[][] tablica;
    private CsvReader reader;
    public CSV(String nazwaBanku,String filename) throws IOException {
        this.iloscKolumn=4;
        wczytaj(nazwaBanku, filename);
    }

    private void wczytaj(String nazwaBanku,String filename) throws IOException{

        reader = new CsvReader(filename,',',Charset.forName("UTF-8"));
        this.iloscWierszy = maxIloscWierszy(reader);
        tablica = new Object[iloscWierszy][iloscKolumn];
        reader = new CsvReader(filename,',',Charset.forName("UTF-8"));

        if(nazwaBanku.equals("iPKO")){            
            int i=0;
            //ominiecie nagłówków
            reader.readRecord();
            while(reader.readRecord()){
                //data operacji
                tablica[i][0] = reader.get(1);
                //typ tranzakcji
                tablica[i][1] = reader.get(2);
                //opis tranzakcji
                tablica[i][3] = reader.get(3);
                //kwota
                tablica[i][2] = reader.get(reader.getColumnCount()-3);
                i++;
            }
        }else
            if(nazwaBanku.equals("Kredyt Bank")){              
            int i=0;
            //ominiecie 4 nagłówków
            // w pliku csv z kredyt banku 4 pierwsze linie nie zawierają interesujacy rzeczy
            reader.readRecord();
            reader.readRecord();
            reader.readRecord();
            reader.readRecord();

            while(reader.readRecord()){
                //pobieranie daty operacji
                tablica[i][0] = reader.get(3);
                //pobieranie typu operacji
                tablica[i][1] = reader.get(6);
                //pobieranie opisu tranzackji
                tablica[i][3] = reader.get(7);
                //pobieranie kwoty
                tablica[i][2] = reader.get(4);
                i++;
            }
            }

      // tablica = poprawPolskieZnaki(tablica);

    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        tablica[rowIndex][columnIndex] = aValue;
        fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public String getColumnName(int column) {
        String tmp="";
        switch(column){
            case 0: tmp = "Data Operacji";
                    break;
            case 1: tmp = "Typ operacji";
                    break;
            case 3: tmp = "Opis operacji";
                    break;
            case 2: tmp = "Kwota";
                    break;
        }
        return tmp;
    }

    
    public void removeRow(int row) {
        Object[][] tmp=new Object[tablica.length-1][3];

        for(int i=0;i<tmp.length;i++){
           if(i<row)
               tmp[i] = tablica[i];
           else
               if(i>=row)
                   tmp[i] = tablica[i+1];
        }
        tablica = tmp;
        
        fireTableStructureChanged();
    }



    public int getRowCount() {
        return tablica.length;
    }

    public int getColumnCount() {
        return this.iloscKolumn;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return tablica[rowIndex][columnIndex];
    }




    private int maxIloscWierszy(CsvReader read){
        int licznik =0;
         try {
            while (read.readRecord()) {
                    licznik++;
            }
        } catch (IOException ex) {
            Logger.getLogger(CSV.class.getName()).log(Level.SEVERE, null, ex);
        }

        return licznik;
    }

    private Object[][] poprawPolskieZnaki(Object[][] tab){

        String tmp = "";
        for(int i=0;i<tab.length;i++){
            for(int j=0;j<tab[i].length;j++){
                tmp = (String)tab[i][j];
              
                    if(tmp!=null){                    
                        tmp = replaceNonUtf8CompliantCharacters(tmp);
                        System.out.println();
                        tab[i][j] = (Object)tmp;
                    }            
            }
        }
        return tab;
    }

    public String replaceNonUtf8CompliantCharacters( final String inString ) {
        int przesuniecie =0;
        if (null == inString ) return null;
        byte[] byteArr = inString.getBytes();
        for ( int i=0; i < byteArr.length; i++ ) {
            byte ch= byteArr[i];
            System.out.print(ch+" ");
            if(ch<0){
                //litera s
                if(byteArr[i]+127==65){
                    if(byteArr[i+1]+127==53){
                        byteArr[i]=115;
                        byteArr[i+1]&=0;
                        //sprawdza czy zasygnalizowano przesuniecie
                        if(przesuniecie==0){
                            przesuniecie = i+1;
                        }

                    }else if(byteArr[i+1]+127==48){ //litera a
                        byteArr[i]=97;
                        byteArr[i+1]&=0;

                        if(przesuniecie==0){
                            przesuniecie = i+1;
                        }
                    }
                }
            }
        }
        //if(przesuniecie!=0)
            //byteArr = przesun(byteArr, przesuniecie);
        return new String( byteArr );
    }

    public byte[] przesun(byte[] tab,int index){
        byte[] tmp = tab;
        for(int i=index;i<tab.length-1;i++){
            tmp[i] = tab[i+1];
        }
        for(int i=0;i<tmp.length;i++){
            if(tmp[i]==-74 || tmp[i]==-79)
                tmp[i]=' ';
        }
        return tmp;
    }
    public JTable autoResizeColWidth(JTable table, AbstractTableModel model) {
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setModel(model);

        int margin = 5;

        for (int i = 0; i < table.getColumnCount(); i++) {
            int                     vColIndex = i;
            DefaultTableColumnModel colModel  = (DefaultTableColumnModel) table.getColumnModel();
            TableColumn             col       = colModel.getColumn(vColIndex);
            int                     width     = 0;

            // Get width of column header
            TableCellRenderer renderer = col.getHeaderRenderer();

            if (renderer == null) {
                renderer = table.getTableHeader().getDefaultRenderer();
            }

            Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);

            width = comp.getPreferredSize().width;

            // Get maximum width of column data
            for (int r = 0; r < table.getRowCount(); r++) {
                renderer = table.getCellRenderer(r, vColIndex);
                comp     = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), false, false,
                        r, vColIndex);
                width = Math.max(width, comp.getPreferredSize().width);
            }

            // Add margin
            width += 2 * margin;

            // Set the width
            col.setPreferredWidth(width);
        }

        ((DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(
            SwingConstants.LEFT);

        // table.setAutoCreateRowSorter(true);
        table.getTableHeader().setReorderingAllowed(false);

        return table;
    }


}
